package linyetao.rbac.service;

import linyetao.rbac.domain.dto.RoleDto;
import linyetao.rbac.domain.entity.Role;
import linyetao.rbac.domain.vo.RoleVo;
import linyetao.rbac.domain.vo.Result;

import java.util.Arrays;

public class RoleService {
    public static int DATA_SIZE = 100;
    public static Role[] data = new Role[DATA_SIZE+1];
    public static int idCounter = 1;

    public static Role createEntity(RoleDto dto, int id) {
        Role role = new Role(dto.name, dto.dataScope);
        role.id = id;
        return role;
    }

    public static void updateEntity(RoleDto dto, Role role) {
        role.name = dto.name;
        role.dataScope = dto.dataScope;
    }


    public static Result create(RoleDto dto){
        if(idCounter > DATA_SIZE){
            return Result.failure("创建失败，超出存储容量");
        }
        Role role = createEntity(dto, idCounter++);
        data[role.id] = role;
        return Result.success("创建成功",null);
    }

    public static Result update(RoleDto dto,int id){
        if(!existsById(id)){
            return Result.failure("更新失败，不存在该数据");
        }
        Role role = data[id];
        updateEntity(dto, role);
        return Result.success("更新成功",null);
    }

   public static RoleVo convertToVo(Role role){
        return new RoleVo(role.id, role.name, role.dataScope);
   }

   public static Result list(){
        RoleVo[] temp = new RoleVo[DATA_SIZE];
        int length = 0;

        for(int i = 1;i<idCounter;i++){
            if (data[i]!=null){
                temp[length++] = convertToVo(data[i]);
            }
       }
        return Result.success("查询成功",Arrays.copyOf(temp,length));
   }

    public static Result delete(int id){
        if (!existsById(id)){
            return Result.failure("删除失败，不存在该数据");
        }
        if (UserService.roleInUse(id)) {
            return Result.failure("删除失败，有⽤户具有该⻆⾊，不能删除");
        }
        data[id] = null;
        return Result.success("删除成功", null);
    }

    public static boolean existsById(int id) {
        return id >= 1 && id < idCounter && data[id] != null;
    }

    public static Role findById(int id) {
        if (existsById(id)) {
            return data[id];
        }
        return null;
    }
}
